From 66e7739f7c86a45cb9da06affb26ef951b0649e5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20H=C3=A4rdeman?= Date: Mon, 17 Nov 2025 23:37:50 +0100 Subject: [PATCH] odhcpd: rename prefix -> prefix_len MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Change a bunch of places where a prefix length is stored as "prefix" to instead call the length "prefix_len", to make it clearer that it is not a prefix that is stored. Signed-off-by: David Härdeman Link: https://github.com/openwrt/odhcpd/pull/320 Signed-off-by: Álvaro Fernández Rojas --- src/dhcpv4.c | 8 +++---- src/dhcpv6-ia.c | 28 +++++++++++----------- src/dhcpv6-ia.h | 4 ++-- src/dhcpv6.h | 2 +- src/netlink.c | 19 +++++++-------- src/odhcpd.c | 2 +- src/odhcpd.h | 6 ++--- src/router.c | 63 ++++++++++++++++++++++++++----------------------- 8 files changed, 68 insertions(+), 64 deletions(-) diff --git a/src/dhcpv4.c b/src/dhcpv4.c index 4178b58..78d7c65 100644 --- a/src/dhcpv4.c +++ b/src/dhcpv4.c @@ -1373,7 +1373,7 @@ static int dhcpv4_setup_addresses(struct interface *iface) if (addr_is_fr_ip(iface, addr)) continue; - odhcpd_bitlen2netmask(false, iface->addr4[i].prefix, &mask); + odhcpd_bitlen2netmask(false, iface->addr4[i].prefix_len, &mask); if ((start & ntohl(~mask.s_addr)) == start && (end & ntohl(~mask.s_addr)) == end && end < ntohl(~mask.s_addr)) { /* Exclude broadcast address */ @@ -1389,7 +1389,7 @@ static int dhcpv4_setup_addresses(struct interface *iface) } /* Don't allocate IP range for subnets smaller than /28 */ - if (iface->addr4[0].prefix > MAX_PREFIX_LEN) { + if (iface->addr4[0].prefix_len > MAX_PREFIX_LEN) { warn("Auto allocation of DHCP range fails on %s (prefix length must be < %d).", iface->name, MAX_PREFIX_LEN + 1); return -1; @@ -1397,7 +1397,7 @@ static int dhcpv4_setup_addresses(struct interface *iface) iface->dhcpv4_local = iface->addr4[0].addr.in; iface->dhcpv4_bcast = iface->addr4[0].broadcast; - odhcpd_bitlen2netmask(false, iface->addr4[0].prefix, &iface->dhcpv4_mask); + odhcpd_bitlen2netmask(false, iface->addr4[0].prefix_len, &iface->dhcpv4_mask); end = start = iface->dhcpv4_local.s_addr & iface->dhcpv4_mask.s_addr; /* Auto allocate ranges */ @@ -1555,7 +1555,7 @@ static void dhcpv4_addrlist_change(struct interface *iface) memset(&ip, 0, sizeof(ip)); ip.addr.in = iface->dhcpv4_local; - ip.prefix = odhcpd_netmask2bitlen(false, &iface->dhcpv4_mask); + ip.prefix_len = odhcpd_netmask2bitlen(false, &iface->dhcpv4_mask); ip.broadcast = iface->dhcpv4_bcast; dhcpv4_setup_addresses(iface); diff --git a/src/dhcpv6-ia.c b/src/dhcpv6-ia.c index dd46a14..b884f9a 100644 --- a/src/dhcpv6-ia.c +++ b/src/dhcpv6-ia.c @@ -271,7 +271,7 @@ static void in6_copy_iid(struct in6_addr *dest, uint64_t iid, unsigned n) struct in6_addr in6_from_prefix_and_iid(const struct odhcpd_ipaddr *prefix, uint64_t iid) { struct in6_addr addr; - uint8_t iid_len = min(128 - prefix->prefix, 64); + uint8_t iid_len = min(128 - prefix->prefix_len, 64); addr = prefix->addr.in6; in6_copy_iid(&addr, iid, iid_len); @@ -321,9 +321,9 @@ static void set_border_assignment_size(struct interface *iface, struct dhcpv6_le continue; if (addr->preferred_lt > (uint32_t)now && - addr->prefix < 64 && - addr->prefix > minprefix) - minprefix = addr->prefix; + addr->prefix_len < 64 && + addr->prefix_len > minprefix) + minprefix = addr->prefix_len; } if (minprefix > 32 && minprefix <= 64) @@ -664,14 +664,14 @@ static size_t build_ia(uint8_t *buf, size_t buflen, uint16_t status, .len = htons(sizeof(o_ia_p) - 4), .preferred_lt = htonl(prefix_preferred_lt), .valid_lt = htonl(prefix_valid_lt), - .prefix = a->length, + .prefix_len = a->length, .addr = addrs[i].addr.in6, }; o_ia_p.addr.s6_addr32[1] |= htonl(a->assigned_subnet_id); o_ia_p.addr.s6_addr32[2] = o_ia_p.addr.s6_addr32[3] = 0; - if (!valid_prefix_length(a, addrs[i].prefix)) + if (!valid_prefix_length(a, addrs[i].prefix_len)) continue; if (buflen < ia_len + sizeof(o_ia_p)) @@ -751,7 +751,7 @@ static size_t build_ia(uint8_t *buf, size_t buflen, uint16_t status, if (!valid_addr(&addrs[i], now)) continue; - if (!valid_prefix_length(a, addrs[i].prefix)) + if (!valid_prefix_length(a, addrs[i].prefix_len)) continue; if (ADDR_MATCH_PIO_FILTER(&addrs[i], iface)) @@ -763,7 +763,7 @@ static size_t build_ia(uint8_t *buf, size_t buflen, uint16_t status, addr.s6_addr32[2] = addr.s6_addr32[3] = 0; if (!memcmp(&ia_p->addr, &addr, sizeof(addr)) && - ia_p->prefix == a->length) + ia_p->prefix_len == a->length) found = true; } else { addr = in6_from_prefix_and_iid(&addrs[i], a->assigned_host_id); @@ -781,7 +781,7 @@ static size_t build_ia(uint8_t *buf, size_t buflen, uint16_t status, .len = htons(sizeof(o_ia_p) - 4), .preferred_lt = 0, .valid_lt = 0, - .prefix = ia_p->prefix, + .prefix_len = ia_p->prefix_len, .addr = ia_p->addr, }; @@ -920,11 +920,11 @@ static bool dhcpv6_ia_on_link(const struct dhcpv6_ia_hdr *ia, struct dhcpv6_leas continue; if (ia->type == htons(DHCPV6_OPT_IA_PD)) { - if (p->prefix < addrs[i].prefix || - odhcpd_bmemcmp(&p->addr, &addrs[i].addr.in6, addrs[i].prefix)) + if (p->prefix_len < addrs[i].prefix_len || + odhcpd_bmemcmp(&p->addr, &addrs[i].addr.in6, addrs[i].prefix_len)) continue; - } else if (odhcpd_bmemcmp(&n->addr, &addrs[i].addr.in6, addrs[i].prefix)) + } else if (odhcpd_bmemcmp(&n->addr, &addrs[i].addr.in6, addrs[i].prefix_len)) continue; onlink = true; @@ -1007,8 +1007,8 @@ ssize_t dhcpv6_ia_handle_IAs(uint8_t *buf, size_t buflen, struct interface *ifac continue; struct dhcpv6_ia_prefix *p = (struct dhcpv6_ia_prefix*)&sdata[-4]; - if (p->prefix) { - reqlen = p->prefix; + if (p->prefix_len) { + reqlen = p->prefix_len; reqhint = ntohl(p->addr.s6_addr32[1]); if (reqlen > 32 && reqlen <= 64) reqhint &= (1U << (64 - reqlen)) - 1; diff --git a/src/dhcpv6-ia.h b/src/dhcpv6-ia.h index c75195b..28bc9c0 100644 --- a/src/dhcpv6-ia.h +++ b/src/dhcpv6-ia.h @@ -19,7 +19,7 @@ #define ADDR_ENTRY_VALID_IA_ADDR(iface, i, m, addrs) \ ((iface)->dhcpv6_assignall || \ (i) == (m) || \ - (addrs)[(i)].prefix > 64) + (addrs)[(i)].prefix_len > 64) size_t get_preferred_addr(const struct odhcpd_ipaddr *addrs, const size_t addrlen); @@ -32,7 +32,7 @@ static inline bool valid_prefix_length(const struct dhcpv6_lease *a, const uint8 static inline bool valid_addr(const struct odhcpd_ipaddr *addr, time_t now) { - return (addr->prefix <= 96 && addr->valid_lt > (uint32_t)now && addr->preferred_lt > (uint32_t)now); + return (addr->prefix_len <= 96 && addr->valid_lt > (uint32_t)now && addr->preferred_lt > (uint32_t)now); } #endif /* _DHCPV6_IA_H_ */ diff --git a/src/dhcpv6.h b/src/dhcpv6.h index a2b08c6..0a7628c 100644 --- a/src/dhcpv6.h +++ b/src/dhcpv6.h @@ -146,7 +146,7 @@ struct dhcpv6_ia_prefix { uint16_t len; uint32_t preferred_lt; uint32_t valid_lt; - uint8_t prefix; + uint8_t prefix_len; struct in6_addr addr; } _o_packed; diff --git a/src/netlink.c b/src/netlink.c index 48e27d0..5396971 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -204,7 +204,7 @@ static void refresh_iface_addr6(int ifindex) change = len != (ssize_t)iface->addr6_len; for (ssize_t i = 0; !change && i < len; ++i) { if (!IN6_ARE_ADDR_EQUAL(&addr[i].addr.in6, &iface->addr6[i].addr.in6) || - addr[i].prefix != iface->addr6[i].prefix || + addr[i].prefix_len != iface->addr6[i].prefix_len || (addr[i].preferred_lt > (uint32_t)now) != (iface->addr6[i].preferred_lt > (uint32_t)now) || addr[i].valid_lt < iface->addr6[i].valid_lt || addr[i].preferred_lt < iface->addr6[i].preferred_lt) change = true; @@ -569,7 +569,7 @@ static int cb_addr_valid(struct nl_msg *msg, void *arg) return NL_SKIP; memset(&addrs[ctxt->ret], 0, sizeof(addrs[ctxt->ret])); - addrs[ctxt->ret].prefix = ifa->ifa_prefixlen; + addrs[ctxt->ret].prefix_len = ifa->ifa_prefixlen; nla_memcpy(&addrs[ctxt->ret].addr, nla_addr, sizeof(addrs[ctxt->ret].addr)); @@ -624,15 +624,14 @@ static int cb_addr_error(_o_unused struct sockaddr_nl *nla, struct nlmsgerr *err static int prefix_cmp(const void *va, const void *vb) { const struct odhcpd_ipaddr *a = va, *b = vb; - int ret = 0; - if (a->prefix == b->prefix) { - ret = (ntohl(a->addr.in.s_addr) < ntohl(b->addr.in.s_addr)) ? 1 : - (ntohl(a->addr.in.s_addr) > ntohl(b->addr.in.s_addr)) ? -1 : 0; - } else - ret = a->prefix < b->prefix ? 1 : -1; + if (a->prefix_len != b->prefix_len) + return a->prefix_len < b->prefix_len ? 1 : -1; - return ret; + if (ntohl(a->addr.in.s_addr) == ntohl(b->addr.in.s_addr)) + return 0; + + return ntohl(a->addr.in.s_addr) < ntohl(b->addr.in.s_addr) ? 1 : -1; } @@ -1037,7 +1036,7 @@ int netlink_setup_addr(struct odhcpd_ipaddr *addr, struct nl_msg *msg; struct ifaddrmsg ifa = { .ifa_family = v6 ? AF_INET6 : AF_INET, - .ifa_prefixlen = addr->prefix, + .ifa_prefixlen = addr->prefix_len, .ifa_flags = 0, .ifa_scope = 0, .ifa_index = ifindex, }; diff --git a/src/odhcpd.c b/src/odhcpd.c index f67e419..c6bfbc9 100644 --- a/src/odhcpd.c +++ b/src/odhcpd.c @@ -695,7 +695,7 @@ void odhcpd_enum_addr6(struct interface *iface, struct dhcpv6_lease *lease, addr = in6_from_prefix_and_iid(&addrs[i], lease->assigned_host_id); } else { - if (!valid_prefix_length(lease, addrs[i].prefix)) + if (!valid_prefix_length(lease, addrs[i].prefix_len)) continue; addr = addrs[i].addr.in6; diff --git a/src/odhcpd.h b/src/odhcpd.h index b706831..c1a31b6 100644 --- a/src/odhcpd.h +++ b/src/odhcpd.h @@ -85,7 +85,7 @@ #define ADDR_MATCH_PIO_FILTER(_addr, iface) (odhcpd_bmemcmp(&(_addr)->addr, \ &(iface)->pio_filter_addr, \ (iface)->pio_filter_length) != 0 || \ - (_addr)->prefix < (iface)->pio_filter_length) + (_addr)->prefix_len < (iface)->pio_filter_length) struct interface; struct nl_sock; @@ -162,14 +162,14 @@ struct netevent_handler { struct odhcpd_ipaddr { union in46_addr addr; - uint8_t prefix; + uint8_t prefix_len; uint32_t preferred_lt; uint32_t valid_lt; union { /* ipv6 only */ struct { - uint8_t dprefix; + uint8_t dprefix_len; bool tentative; }; diff --git a/src/router.c b/src/router.c index f8fa759..d5e30e9 100644 --- a/src/router.c +++ b/src/router.c @@ -300,8 +300,13 @@ static bool router_icmpv6_valid(struct sockaddr_in6 *source, uint8_t *data, size /* Detect whether a default route exists, also find the source prefixes */ static bool parse_routes(struct odhcpd_ipaddr *n, ssize_t len) { - struct odhcpd_ipaddr p = { .addr.in6 = IN6ADDR_ANY_INIT, .prefix = 0, - .dprefix = 0, .preferred_lt = 0, .valid_lt = 0}; + struct odhcpd_ipaddr p = { + .addr.in6 = IN6ADDR_ANY_INIT, + .prefix_len = 0, + .dprefix_len = 0, + .preferred_lt = 0, + .valid_lt = 0 + }; bool found_default = false; char line[512], ifname[16]; @@ -315,16 +320,16 @@ static bool parse_routes(struct odhcpd_ipaddr *n, ssize_t len) found_default = true; } else if (sscanf(line, "%8" SCNx32 "%8" SCNx32 "%*8" SCNx32 "%*8" SCNx32 " %hhx %*s " "%*s 00000000000000000000000000000000 %*s %*s %*s %" SCNx32 " lo", - &p.addr.in6.s6_addr32[0], &p.addr.in6.s6_addr32[1], &p.prefix, &rflags) && - p.prefix > 0 && (rflags & RTF_NONEXTHOP) && (rflags & RTF_REJECT)) { + &p.addr.in6.s6_addr32[0], &p.addr.in6.s6_addr32[1], &p.prefix_len, &rflags) && + p.prefix_len > 0 && (rflags & RTF_NONEXTHOP) && (rflags & RTF_REJECT)) { // Find source prefixes by scanning through unreachable-routes p.addr.in6.s6_addr32[0] = htonl(p.addr.in6.s6_addr32[0]); p.addr.in6.s6_addr32[1] = htonl(p.addr.in6.s6_addr32[1]); for (ssize_t i = 0; i < len; ++i) { - if (n[i].prefix <= 64 && n[i].prefix >= p.prefix && - !odhcpd_bmemcmp(&p.addr.in6, &n[i].addr.in6, p.prefix)) { - n[i].dprefix = p.prefix; + if (n[i].prefix_len <= 64 && n[i].prefix_len >= p.prefix_len && + !odhcpd_bmemcmp(&p.addr.in6, &n[i].addr.in6, p.prefix_len)) { + n[i].dprefix_len = p.prefix_len; break; } } @@ -416,7 +421,7 @@ struct nd_opt_search_list { struct nd_opt_route_info { uint8_t type; uint8_t len; - uint8_t prefix; + uint8_t prefix_len; uint8_t flags; uint32_t lifetime; uint32_t addr[4]; @@ -451,8 +456,8 @@ static struct ra_pio *router_find_ra_pio(struct interface *iface, for (size_t i = 0; i < iface->pio_cnt; i++) { struct ra_pio *cur_pio = &iface->pios[i]; - if (addr->prefix == cur_pio->length && - !odhcpd_bmemcmp(&addr->addr.in6, &cur_pio->prefix, cur_pio->length)) + if (addr->prefix_len == cur_pio->length && + !odhcpd_bmemcmp(&addr->addr.in6, &cur_pio->prefix, cur_pio->length)) return cur_pio; } @@ -489,7 +494,7 @@ static void router_add_ra_pio(struct interface *iface, iface->pio_cnt++; memcpy(&pio->prefix, &addr->addr.in6, sizeof(pio->prefix)); - pio->length = addr->prefix; + pio->length = addr->prefix_len; pio->lifetime = 0; iface->pio_update = true; @@ -655,8 +660,8 @@ static int send_router_advert(struct interface *iface, const struct in6_addr *fr for (size_t j = 0; j < valid_addr_cnt; j++) { struct odhcpd_ipaddr *cur_addr = &addrs[j]; - if (cur_pio->length == cur_addr->prefix && - !odhcpd_bmemcmp(&cur_pio->prefix, &cur_addr->addr.in6, cur_pio->length)) { + if (cur_pio->length == cur_addr->prefix_len && + !odhcpd_bmemcmp(&cur_pio->prefix, &cur_addr->addr.in6, cur_pio->length)) { pio_found = true; break; } @@ -666,7 +671,7 @@ static int send_router_advert(struct interface *iface, const struct in6_addr *fr struct odhcpd_ipaddr *addr = &addrs[total_addr_cnt]; memcpy(&addr->addr.in6, &cur_pio->prefix, sizeof(addr->addr.in6)); - addr->prefix = cur_pio->length; + addr->prefix_len = cur_pio->length; addr->preferred_lt = 0; addr->valid_lt = (uint32_t) (now + ND_VALID_LIMIT); total_addr_cnt++; @@ -681,9 +686,9 @@ static int send_router_advert(struct interface *iface, const struct in6_addr *fr uint32_t preferred_lt = 0; uint32_t valid_lt = 0; - if (addr->prefix > 96 || (i < valid_addr_cnt && addr->valid_lt <= (uint32_t)now)) { + if (addr->prefix_len > 96 || (i < valid_addr_cnt && addr->valid_lt <= (uint32_t)now)) { info("Address %s (prefix %d, valid-lifetime %u) not suitable as RA prefix on %s", - inet_ntop(AF_INET6, &addr->addr.in6, buf, sizeof(buf)), addr->prefix, + inet_ntop(AF_INET6, &addr->addr.in6, buf, sizeof(buf)), addr->prefix_len, addr->valid_lt, iface->name); continue; } @@ -696,9 +701,9 @@ static int send_router_advert(struct interface *iface, const struct in6_addr *fr } for (size_t i = 0; i < pfxs_cnt; ++i) { - if (addr->prefix == pfxs[i].nd_opt_pi_prefix_len && - !odhcpd_bmemcmp(&pfxs[i].nd_opt_pi_prefix, - &addr->addr.in6, addr->prefix)) + if (addr->prefix_len == pfxs[i].nd_opt_pi_prefix_len && + !odhcpd_bmemcmp(&pfxs[i].nd_opt_pi_prefix, + &addr->addr.in6, addr->prefix_len)) p = &pfxs[i]; } @@ -752,17 +757,17 @@ static int send_router_advert(struct interface *iface, const struct in6_addr *fr } odhcpd_bmemcpy(&p->nd_opt_pi_prefix, &addr->addr.in6, - (iface->ra_advrouter) ? 128 : addr->prefix); + (iface->ra_advrouter) ? 128 : addr->prefix_len); p->nd_opt_pi_type = ND_OPT_PREFIX_INFORMATION; p->nd_opt_pi_len = 4; - p->nd_opt_pi_prefix_len = (addr->prefix < 64) ? 64 : addr->prefix; + p->nd_opt_pi_prefix_len = (addr->prefix_len < 64) ? 64 : addr->prefix_len; /* RFC9762 DHCPv6-PD Preferred Flag § 6: * Routers SHOULD set the P flag to zero by default... */ p->nd_opt_pi_flags_reserved = 0; if (!iface->ra_not_onlink) p->nd_opt_pi_flags_reserved |= ND_OPT_PI_FLAG_ONLINK; - if (iface->ra_slaac && addr->prefix <= 64) + if (iface->ra_slaac && addr->prefix_len <= 64) p->nd_opt_pi_flags_reserved |= ND_OPT_PI_FLAG_AUTO; if (iface->dhcpv6 != MODE_DISABLED && iface->dhcpv6_pd && iface->dhcpv6_pd_preferred) /* RFC9762 DHCPv6-PD Preferred Flag @@ -961,10 +966,10 @@ static int send_router_advert(struct interface *iface, const struct in6_addr *fr struct nd_opt_route_info *tmp; uint32_t valid_lt; - if (addr->dprefix >= 64 || addr->dprefix == 0 || addr->valid_lt <= (uint32_t)now) { + if (addr->dprefix_len >= 64 || addr->dprefix_len == 0 || addr->valid_lt <= (uint32_t)now) { info("Address %s (dprefix %d, valid-lifetime %u) not suitable as RA route on %s", inet_ntop(AF_INET6, &addr->addr.in6, buf, sizeof(buf)), - addr->dprefix, addr->valid_lt, iface->name); + addr->dprefix_len, addr->valid_lt, iface->name); continue; /* Address not suitable */ } @@ -976,10 +981,10 @@ static int send_router_advert(struct interface *iface, const struct in6_addr *fr continue; /* PIO filtered out of this RA */ } - if (addr->dprefix > 32) { - addr->addr.in6.s6_addr32[1] &= htonl(~((1U << (64 - addr->dprefix)) - 1)); - } else if (addr->dprefix <= 32) { - addr->addr.in6.s6_addr32[0] &= htonl(~((1U << (32 - addr->dprefix)) - 1)); + if (addr->dprefix_len > 32) { + addr->addr.in6.s6_addr32[1] &= htonl(~((1U << (64 - addr->dprefix_len)) - 1)); + } else if (addr->dprefix_len <= 32) { + addr->addr.in6.s6_addr32[0] &= htonl(~((1U << (32 - addr->dprefix_len)) - 1)); addr->addr.in6.s6_addr32[1] = 0; } @@ -994,7 +999,7 @@ static int send_router_advert(struct interface *iface, const struct in6_addr *fr memset(&routes[routes_cnt], 0, sizeof(*routes)); routes[routes_cnt].type = ND_OPT_ROUTE_INFO; routes[routes_cnt].len = sizeof(*routes) / 8; - routes[routes_cnt].prefix = addr->dprefix; + routes[routes_cnt].prefix_len = addr->dprefix_len; routes[routes_cnt].flags = 0; if (iface->route_preference < 0) routes[routes_cnt].flags |= ND_RA_PREF_LOW; -- 2.30.2